<?php
/**
 * Database ENCOding REPair tool
 * Part of WheelDB Framework demos
 * 
 * @author Richard Ejem
 * @package WDB
 */
use WDB\Database;
$done = false;


require '../../nette.min.php';
Nette\Diagnostics\Debugger::enable();
Nette\Diagnostics\Debugger::$strictMode = TRUE;


if (isset($_POST['host']))
{
    $messages = array();
    $utf_broken = array();
    set_time_limit(0); // conversion can take long time
    require '../../loader.php';
    Database::registerConnection('encorep',
            WDB\Structure\ConnectionConfig::create('MySQL',
                    $_POST['host'], $_POST['user'], $_POST['password'],
                    $_POST['schema'], FALSE, $_POST['conn_charset'], $_POST['port'])        
            );
    $db = Database::getInstance('encorep');

    $schema = $db->getSchema();
    
    //set WDB to throw exception on invalid UTF8 characters
    if (empty($_POST['utf8ignore'])) WDB\Database::$brokenUTFMode = WDB\Database::BU_EXCEPTION;
    foreach ($schema->getTables() as $table)
    {
        if ($table instanceof WDB\Analyzer\View) continue;
        /* @var $table WDB\Analyzer\iTable */
        $wrapper = WDB\Wrapper\TableFactory::fromAnalyzer($table);
        
        $messages [] = 'Konvertuji tabulku '.$table->getName(). ', '.$wrapper->count().' záznamů';
        
        /* @var $row WDB\Wrapper\Record*/
        foreach ($wrapper as $row)
        {
            $db->getDriver()->setCharset($_POST['real_charset']);
            $row->setWriteMode(WDB\Wrapper\iRecord::WM_ALL);
            try
            {
                $row->save();
            }
            catch (WDB\Exception\InvalidUTFString $ex)
            {
                $message[] = 'chybný utf8 řetězec';
                /* leave invalid utf8 character rows as their are. if this occurs,
                    it means that we told this utility that actual data encoding is UTF,
                    but some UTF invalid strings are actually stored.
                    we leave them as they are for further solution in order to not break them.*/
                $utf_broken[] = array('table'=>$table->getName(), 'key'=>$row->getIdentificationKey());
            }
            $db->getDriver()->setCharset($_POST['conn_charset']);
        }
    }
    $done = true;
}
?>
<html>
    <head>
        <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    </head>
    <body>
        <?php if ($done) {?>
            <p>Databáze konvertována</p>
            <?php if ($utf_broken) {?>
                <p>Některé řádky nemohly být konvertovány, protože obsahují neplatné UTF8 znaky. Následuje
                    výpis identifikačních klíčů těchto řádků:</p>
                <pre><?php var_export($utf_broken); ?>
            <?php } ?>
            <p><strong>Záznam průběhu:</strong><br>
            <?php echo implode('<br />', $messages); ?></p>
        <?php } else {?>
        <p>Důrazně doporučujeme před spuštěním této utility databázi zálohovat.</p>
        <form method="post" action="">
            <table>
                <tr>
                    <th>Server:</th>
                    <td><input type="text" name="host" value="127.0.0.1" /></td>
                </tr>
                <tr>
                    <th>Uživatel:</th>
                    <td><input type="text" name="user" value="root" /></td>
                </tr>
                <tr>
                    <th>Heslo:</th>
                    <td><input type="password" name="password" value="" /></td>
                </tr>
                <tr>
                    <th>Schéma (databáze):</th>
                    <td><input type="text" name="schema" value="" /></td>
                </tr>
                <tr>
                    <th>Port:</th>
                    <td><input type="text" name="port" value="3306" /></td>
                </tr>
                <tr>
                    <th>Uvedené kódování:</th>
                    <td><input type="text" name="conn_charset" value="latin2" /></td>
                </tr>
                <tr>
                    <th>Skutečné kódování:</th>
                    <td><input type="text" name="real_charset" value="utf8" /></td>
                </tr>
                <tr>
                    <th>Konvertovat neplatné UTF znaky:</th>
                    <td><input type="checkbox" name="utf8ignore" value="1" />
                        Zaškrtnutí této volby způsobí, že pokud je uvedeno skutečné kódování utf8,
                        neplatné utf8 znaky budou z textů odstraněny.<br />
                        Ponechání této volby vypnuté zanechá řádky s neplatnými daty beze změny
                        a na konci konverze vypíše jejich seznam.
                    </td>
                </tr>
                <tr><td colspan="2"><input type="submit" value="opravit kódování" /></td></tr>
            </table>
            
        </form>
        <?php } ?>
    </body>
</html>